技術文章
技術問答
My Project
iT 徵才
聊天室
2026 鐵人賽
登入/註冊
文章
問答
Tag
邦友
鐵人賽
搜尋
2026 iThome 鐵人賽
DAY
21
0
自我挑戰組
學習C#續
系列 第
21
篇
Day 21: 多執行緒基礎與執行緒安全(Thread & Concurrency)
18th鐵人賽
413570622
2026-10-04 19:29:04
53 瀏覽
分享至
執行緒(Thread)基礎:
程式執行的最小獨立單元。透過建立多個執行緒,可以讓多項任務在背景同時(並行/並行)執行,避免耗時任務阻塞主執行緒(如終端機畫面凍結)。
命名空間為 System.Threading。
Thread vs ThreadPool(執行緒池):
手動 Thread:
每次 new Thread() 都會向作業系統索取原生執行緒,建立與銷毀的開銷極大(預設每個執行緒配置約 1 MB 堆疊記憶體)。
適合執行時間很長(如背景常駐監控服務)或需要自訂執行緒優先權、設定前台/背景屬性的情境。
ThreadPool(執行緒池):
預先建立並維護一組閒置執行緒供全域重複利用,工作完成後將執行緒歸還池中,省去反覆建立銷毀的耗損。
透過 ThreadPool.QueueUserWorkItem(...) 派工。
適合執行時間短暫、頻繁發生的背景微型任務(現代 Task 底層亦基於此機制)。
資料競爭(Race Condition):
當多個執行緒同時讀寫同一個共享變數(Shared Resource),且最終結果取決於執行緒切換的先後時序時,就會發生資料競爭,導致數據計算錯誤(例如經典的「計數器數值遺失」或「銀行帳戶超額提款」)。
例如 count++ 在底層其實分為三步驟:讀取值->加一->寫回值。若兩個執行緒在此期間交錯執行,部分累加就會被覆蓋。
lock 關鍵字(互斥鎖):
確保同一時間只有一個執行緒能進入受保護的關鍵程式區塊(Critical Section),其餘執行緒必須在門外排隊等待。
編譯後等價於 Monitor.Enter 與 Monitor.Exit 搭配 try-finally 結構。
鎖定物件的最佳實踐:
宣告一個專屬的私有唯讀參考物件:private readonly object _lockObj = new object();。
絕不要鎖定 this、typeof(MyClass) 或 string(字串拘留機制會造成不可預期的跨程式碼鎖定衝突)。
實作範例
留言
追蹤
檢舉
上一篇
Day 20:資源釋放與記憶體管理
下一篇
Day 22:非同步程式設計基礎(Async / Await)
系列文
學習C#續
共
29
篇
目錄
RSS系列文
訂閱系列文
1
人訂閱
25
Day 25: 控制台輕量資料庫:SQLite 與 EF Core
26
Day 26: 物件導向設計原則(SOLID)與控制台架構思維
27
Day 27: 單元測試實戰(Unit Testing)
28
Day 28: 綜合實作專案(一):Console 系統架構與選單設計
29
Day 29: 綜合實作專案(二):資料庫串接、LINQ 統計與非同步匯出
完整目錄
熱門推薦
{{ item.subject }}
{{ item.channelVendor }}
|
{{ item.webinarstarted }}
|
{{ formatDate(item.duration) }}
直播中
立即報名
尚未有邦友留言
立即登入留言
iThome鐵人賽
參賽組數
929
組
團體組數
32
組
累計文章數
19616
篇
完賽人數
317
人
看影片追技術
看更多
{{ item.subject }}
{{ item.channelVendor }}
|
{{ formatDate(item.duration) }}
直播中
熱門tag
15th鐵人賽
16th鐵人賽
13th鐵人賽
17th鐵人賽
14th鐵人賽
18th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
javascript
2018鐵人賽
python
2017鐵人賽
windows
php
c#
linux
windows server
css
熱門問題
我的出發點錯了嗎
excel 檔案損毀的情況
鎖住個人檔案
MAMP中mysql基礎設定更改後server not running
2026年-請益支援中文codeing 的地端LLM
熱門回答
我的出發點錯了嗎
excel 檔案損毀的情況
熱門文章
一個寫了8年的資料庫工具 – JasonQuery,現在正式開源
高層的痛點省思
APK 無法安裝?從解析錯誤到簽名衝突:7 個常見原因與實用解法
BitTorrent 种子下载与 Magnet 磁力下载
AI API網站怎麼選?從六種服務比較,到訂單資料擷取實測
IT邦幫忙
×
標記使用者
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{ result.label }}
{{ result.account }}